package com.chasing.baseframe.db.base;

import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.OnConflictStrategy;
import androidx.room.Update;

import java.util.List;

import io.reactivex.rxjava3.core.Single;

/**
 * Single 和 Flowable
 * Single进行单次查询
 * Flowable在进行查询后，会进行监听，如果数据发生变化则会进行回调
 * <p>
 * 默认的插入、更新、删除，都是以主键进行匹配
 * <p>
 * 注意：insert进行replace的时候，所有属性都会被替换，部分而外处理的属性，需要过滤不覆盖
 */
@Dao
public interface BaseDao<T> {

    // 插入策略：如果数据库已经存在主键一样的数据，则进行replace替换，效果和update一样
    // 区别在于：update更新原有数据，insert是删除原数据，之后插入新数据
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    Single<Long> insert(T t);

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    Single<List<Long>> insert(List<T> tList);

    //  返回更新的数量
    @Update()
    Single<Integer> update(T t);

    @Update()
    Single<Integer> update(List<T> tList);

    //  返回删除的数量
    @Delete
    Single<Integer> delete(T t);

    @Delete
    Single<Integer> delete(List<T> tList);

}
